// import CookieJs from 'js-cookie'
// 将 token 存储在 vuex 中，vuex 刷新就没了，需要解决刷新就没了的问题
import { getToken, setToken } from '@/utils/auth'
import { sysLogin } from '@/api/test.js'
import { Message } from 'element-ui'
import { sysProfile, sysUser } from '@/api/user.js'
import asyncRoutes from '@/router/modules/index'
import Router from '@/router'
import { constantRoutes, resetRouter } from '@/router'

const state = {
  // 每当页面刷新的时候，vuex 会初始化重新执行这个代码，所以就要在初始化的时候就获取本地token 值，如果没有就为空值
  token: getToken() || '',
  userInfo: ''
}
const mutations = {
  setToken(state, value) {
    state.token = value
    setToken(value)
    // CookieJs.set('hr', value)
  },
  setUserInfo(state, value) {
    state.userInfo = value
  },
  logOut() {
    // this === this.$store
    // token 失效的时候，清空 token 以及用户信息
    this.commit('user/setToken', '')
    this.commit('user/setUserInfo', '')
    // 重置路由
    // 每次退出登录都重置路由
    resetRouter()
  }
}
const getters = {}
const actions = {
  // 登陆
  async toLogin(store, form) {
    // 调用接口设置token
    const res = await sysLogin(form)
    Message.success('登陆成功')
    store.commit('setToken', res.data)
  },
  // 获取用户信息
  async getUserInfo({ commit }) {
    const res = await sysProfile()
    // 获取用户头像
    const res2 = await sysUser(res.data.userId)
    // 合并对象 {a:1,obj:{xxx:2}}   {b:2} ===> {a:1,b:2,obj:{xxx:1}}
    // 1. {...res,...res2}
    // 2. 返回值=Object.assign(目标对象，其他对象。。)
    commit('setUserInfo', Object.assign({}, res.data, res2.data))
    // 在获取完用户信息后匹配出该用户能访问的页面路由
    const newArr = asyncRoutes.filter((item) => {
      return res.data.roles.menus.includes(item.meta.name)
    })
    // 将404页面加到最后
    Router.addRoutes([...newArr, { path: '*', redirect: '/404', hideen: true }])
    // 拿到完整路由信息[静态路由，匹配到的动态路由，404匹配路由]
    const allRoutes = [
      ...constantRoutes,
      ...newArr,
      {
        path: '*',
        redirect: '/404',
        hideen: true
      }
    ]
    // 调用其他模块的mutations方法
    // commit('模块名/方法名',参数,{root:true})
    commit('routes/setRouteList', allRoutes, { root: true })
    console.log('newArr', newArr)
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  getters,
  actions
}
